        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
z        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
H        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
8        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
\        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
\        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
M        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
G        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🔧        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
z        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🚀        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
G        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
4        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🟢        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
⏹        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
️        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🔄        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
4        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
8        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
5        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
!        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
✏        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
️        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
4        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🗑        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
️        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
➕        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
─        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Q        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
K        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
+        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
%        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🛠        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🛠        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
M        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🔴        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
M        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
G        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🌍        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
G        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
H        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
4        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
H        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
4        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
7        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
G        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
📅        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
H        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
2        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
📦        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
P        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
M        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
K        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
K        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
S        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
V        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
x        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
W        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
M        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
3        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
✅        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
*        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
—        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
!        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
❌        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🚀        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
&        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
A        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
L        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
B        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
1        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
0        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
T        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
🧪        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
Y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
U        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
→        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
✅        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
F        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
I        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
D        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
j        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
O        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
-        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
h        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
←        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
y        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
#        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
z        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
→        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
E        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
w        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
k        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
=        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
[        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
]        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
💾        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
R        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
{        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
}        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
'        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
v        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
!        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
b        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
←        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
c        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
/        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
C        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
:        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
p        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
d        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
g        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
_        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
f        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
i        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
l        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
a        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
m        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
"        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
,        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
N        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
o        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
         # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
s        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
t        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
.        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
e        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
r        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
u        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
n        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
(        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
)        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")

        # ====================== LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS ======================
        rule_events = initial.get("events", [])
        if rule_events:
            st.caption("🔴 LIVE RULE TESTER — MULTI-EVENT + ALL BUCKETS (real data)")

            # Global (shared)
            with st.expander("🌍 GLOBAL CONSTANTS", expanded=True):
                ctx_global = engine.hub.get_rule_context(rule_events[0])
                for k in ["Heat4h", "Heat10m", "Pace24h", "Pace7d", "Pace30d", "PaceAVG"]:
                    st.metric(k, f"{ctx_global.get(k, 0):.2f}")

            # One collapsible section per EVENT
            for event_slug in rule_events:
                with st.expander(f"📅 EVENT: {event_slug}", expanded=True):
                    # Per-slug layer
                    ctx_event = engine.hub.get_rule_context(event_slug)
                    for k in ["RHours", "Progress", "Count", "Peak"]:
                        st.metric(k, f"{ctx_event.get(k, 0):.2f}")

                    # ALL BUCKETS for this event
                    bins = engine.hub.get_bins_for_event(event_slug)
                    with st.expander(f"📦 ALL BUCKETS ({len(bins)})", expanded=False):
                        for bin_info in bins:
                            token = bin_info["token"]
                            label = bin_info["label"]
                            ctx_bucket = engine.hub.get_rule_context(event_slug)
                            # Merge per-bucket data
                            market_data = engine.hub.market_cache.get((event_slug, token), {})
                            ctx_bucket.update({
                                "Bucket":  label,
                                "Vola":    market_data.get("vola", 0.08),
                                "Volume":  market_data.get("volume", 0),
                                "Top":     market_data.get("top", 0),
                                "Center":  market_data.get("center", 0),
                                "Bottom":  market_data.get("bottom", 0),
                                "Price":   market_data.get("current_price", 0.5)
                            })
                            st.write(f"**{label}** (token: {str(token)[:12]}...)")
                            colB1, colB2, colB3 = st.columns(3)
                            with colB1:
                                st.metric("Vola", f"{ctx_bucket['Vola']:.2f}")
                                st.metric("Volume", f"{ctx_bucket['Volume']:.0f}")
                            with colB2:
                                st.metric("Top", f"{ctx_bucket['Top']}")
                                st.metric("Center", f"{ctx_bucket['Center']}")
                            with colB3:
                                st.metric("Bottom", f"{ctx_bucket['Bottom']}")
                                st.metric("Price", f"{ctx_bucket['Price']:.3f}")

            st.divider()
            st.write("**Condition result (tested on first event)**")
            test_result = engine.evaluate_rule(initial, rule_events[0])
            st.success("✅ CONDITION **TRUE** — rule would fire!" if test_result else "❌ CONDITION false")
        else:
            st.info("No events selected in this rule yet.")
